package com.xframe.xdal.core.model;

import com.xframe.xdal.core.model.mapping.IColumnMapping;
import com.xframe.xdal.core.model.mapping.ITableInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能描述:构件UPDATE SQL的上下文对象
 *
 * @author xufeng
 * @version 1.0
 * @date 2022-09-26
 */
public class UpdateAttr {

    /**
     * set 列表字段
     */
    //private List<String> fieldNameList;

    private Map<String,UpdateSetWrap> updateSetWrapList;

    /**
     * where条件的模式 主键 还是 唯一键
     */
    private UpdateWhereMode updateWhereMode;

    /**
     * 是否添加ver条件
     */
    private boolean verFlag;



    public UpdateAttr(UpdateWhereMode updateWhereMode,Map<String,UpdateSetWrap> updateSetWrapList,boolean verFlag){
        this.updateSetWrapList = updateSetWrapList;
        this.updateWhereMode = updateWhereMode;
        this.verFlag = verFlag;
    }
    /**
     * 构造函数
     *
     * @param updateWhereMode where条件的模式主键 还是 唯一键
     * @param fieldNameList set字段列表
     * @param verFlag 是否添加版本号条件
     */
    public UpdateAttr(UpdateWhereMode updateWhereMode,List<String> fieldNameList,boolean verFlag){
        //this.fieldNameList = fieldNameList;
        this.updateSetWrapList = new HashMap<>();
        if(fieldNameList != null){
            for(String name : fieldNameList){
                this.updateSetWrapList.put(name,new UpdateSetWrap(name));
            }
        }

        this.updateWhereMode = updateWhereMode;
        this.verFlag = verFlag;
    }

    /**
     * 构造函数
     *
     *
     * @param verFlag 是否添加版本号条件
     */
    public UpdateAttr(boolean verFlag){
        this.updateSetWrapList = new HashMap<>();
        this.updateWhereMode = UpdateWhereMode.PK;
        this.verFlag = verFlag;
    }
    /**
     * 构造函数
     *
     * @param updateWhereMode where条件的模式主键 还是 唯一键
     * @param verFlag 是否添加版本号条件
     */
    public UpdateAttr(UpdateWhereMode updateWhereMode,boolean verFlag){
        this.updateSetWrapList = new HashMap<>();
        this.updateWhereMode = updateWhereMode;
        this.verFlag = verFlag;
    }
    /**
     * 构造函数
     *
     * @param updateWhereMode where条件的模式主键 还是 唯一键
     */
    public UpdateAttr(UpdateWhereMode updateWhereMode){
        this.updateSetWrapList = new HashMap<>();
        this.updateWhereMode = updateWhereMode;
        this.verFlag = false;
    }

    /**
     * 构造函数
     */
    public UpdateAttr(){
        this.updateSetWrapList = new HashMap<>();
        this.updateWhereMode = UpdateWhereMode.PK;
        this.verFlag = false;
    }

    /**
     * 添加一个呗set的字段
     *
     * @param name 查询对象
     */
    public UpdateAttr addfieldName(String name){
        this.updateSetWrapList.put(name,new UpdateSetWrap(name));
        return this;
    }

    /**
     * 添加一个呗set的字段
     *
     * @param updateSetWrap 查询对象
     */
    public UpdateAttr addfieldName(UpdateSetWrap updateSetWrap){
        this.updateSetWrapList.put(updateSetWrap.getFieldName(),updateSetWrap);
        return this;
    }

    public Map<String,UpdateSetWrap>  getUpdateSetWrapList() {
        return this.updateSetWrapList;
    }

    public UpdateWhereMode getUpdateWhereMode() {
        return updateWhereMode;
    }

    public boolean isVerFlag() {
        return verFlag;
    }



    public UpdateSetWrap getUpdateSetWrap(String name){

        UpdateSetWrap updateSetWrap = this.updateSetWrapList.get(name);
        if(updateSetWrap == null){
            updateSetWrap = new UpdateSetWrap(name);
            this.updateSetWrapList.put(name,updateSetWrap);
        }
        return updateSetWrap;
    }

    /**
     * 获得一个set字段列表
     *
     * @param tableInfo ITableInfo对象
     */
    public List<IColumnMapping> getSetColumnMappingList(ITableInfo tableInfo){
        List<IColumnMapping> columnMappingList = new ArrayList<>();
        if(this.updateSetWrapList == null || this.updateSetWrapList.size() == 0){
            columnMappingList = tableInfo.findCanUpdateList();
        }else {

            for (String name : this.updateSetWrapList.keySet()) {
                IColumnMapping columnMapping = tableInfo.findOneByFieldName(name);
                if (columnMapping != null) {
                    columnMappingList.add(columnMapping);
                }
            }
        }
        return columnMappingList;
    }


    public List<IColumnMapping> getWhereColumnMappingList(ITableInfo tableInfo){
        List<IColumnMapping> whereColumnMappingList = null;
        if(this.updateWhereMode == UpdateWhereMode.PK){
            whereColumnMappingList = new ArrayList<>();
            whereColumnMappingList.add(tableInfo.findPkFirst());
        }else {
            whereColumnMappingList = tableInfo.findUniqueKeyList();
        }
        if(this.verFlag){
            whereColumnMappingList.add(tableInfo.findVer());
        }
        return whereColumnMappingList;
    }

}
